"""
演示：如何获取进程编号：
    细节：
        1：一个进程拥有一个唯一的进程id，当该进程被关闭的时候，进程id也会同时被释放，即：进程id是可以被重复的使用
        2：知道了进程id，就可以锁定到唯一的进程，方便进行管理和维护，以及梳理子进程和父进程之间的关系
        3：获取当前的进程id，有两种方式：
            方式1：os模块的getpid()函数
            方式2：multiprocessing模块的pid属性
        4：获取当前进程的父id，方式如下：
            os模块的getppid()函数
"""
import multiprocessing
import os
import time


# 1: 定义函数，表示写代码
def coding(name, num):
    for i in range(num):
        print(f"{name}，正在写第{i}行代码...")
        time.sleep(1) # 休眠1秒
        print(f"p1进程的id为：{os.getpid()}, {multiprocessing.current_process().pid}, 它的父进程id为： {os.getppid()}")

# 1：定义函数，表示听音乐
def music(name, count):
    for i in range(count):
        print(f"{name}，正在听第{i}首音乐...")
        time.sleep(1) # 休眠1秒
        print(f"p2进程的id为：{os.getpid()}, {multiprocessing.current_process().pid}, 它的父进程id为： {os.getppid()}")

# 一心可以二用
if __name__ == '__main__':
    # 2：创建进程对象，关联：要执行任务（函数）
    p1 = multiprocessing.Process(target=coding, name="小王", args=("小王", 10))
    p2 = multiprocessing.Process(target=music, name="小李", kwargs={"count":10, "name":"小李"})

    # 3: 开启进程
    p1.start()
    p2.start()

    # 4：打印进程的名（子进程）
    print(f"p1进程的名字：{p1.name},id:{p1.pid}")
    print(f"p2进程的名字：{p2.name},id:{p2.pid}")

    # 打印主进程的名字
    print(f"main主进程的ID：{multiprocessing.current_process().pid}, 名字：{multiprocessing.current_process().name}, 它的父进程ID为：{os.getppid()}")